Reintroduce the changes made by changeset 7455:021324804fbd, which were
authoremellor@leeni.uk.xensource.com <emellor@leeni.uk.xensource.com>
Sat, 22 Oct 2005 10:04:45 +0000 (11:04 +0100)
committeremellor@leeni.uk.xensource.com <emellor@leeni.uk.xensource.com>
Sat, 22 Oct 2005 10:04:45 +0000 (11:04 +0100)
disabled by workaround 7468:17a9f111fa93.  We additionally need to set the
FD_CLOEXEC flag on the status fd given to SrvServer when spawning the network
script, as at least on some platforms this causes xend to fail to start
properly.

Signed-off-by: Ewan Mellor <ewan@xensource.com>
tools/python/xen/util/process.py [deleted file]
tools/python/xen/xend/Vifctl.py
tools/python/xen/xend/server/SrvServer.py

diff --git a/tools/python/xen/util/process.py b/tools/python/xen/util/process.py
deleted file mode 100644 (file)
index 9117ef4..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
-# Copyright (C) 2005 Christian Limpach <Christian.Limpach@cl.cam.ac.uk>
-
-# os.system() replacement which outputs through the logger
-
-import popen2
-import select
-import string
-
-from xen.xend.XendLogging import log
-
-def runscript(cmd):
-    # split after first space, then grab last component of path
-    cmdname = "[%s] " % cmd.split()[0].split('/')[-1]
-    # run command and grab stdin, stdout and stderr
-    cout, cin, cerr = popen2.popen3(cmd)
-    # close stdin to get command to terminate if it waits for input
-    cin.close()
-    # wait for output and process
-    p = select.poll()
-    p.register(cout)
-    p.register(cerr)
-    stdout = ""
-    while True:
-        r = p.poll()
-        for (fd, event) in r:
-            if event == select.POLLHUP:
-                cout.close()
-                cerr.close()
-                return stdout
-            if fd == cout.fileno():
-                stdout = stdout + cout.readline()
-            if fd == cerr.fileno():
-                l = cerr.readline()
-                if l[0] == '-':
-                    log.debug(cmdname + l[1:].rstrip())
-                elif l[0] == '*':
-                    log.info(cmdname + l[1:].rstrip())
-                else:
-                    log.error(cmdname + l.rstrip())
index fe37dfc50617926ad850daeb91c409d3d09632bb..382cba5c04846a911a7398a74854a004a4a050e1 100644 (file)
@@ -20,9 +20,9 @@
 """
 import os
 
-import xen.util.process
 import XendRoot
 
+
 def network(op):
     """Call a network control script.
 
@@ -32,6 +32,4 @@ def network(op):
         raise ValueError('Invalid operation: ' + op)
     script = XendRoot.instance().get_network_script()
     if script:
-        xen.util.process.runscript(script + " " + op)
-        #os.spawnl(os.P_WAIT, script, script, op)
-
+        os.spawnl(os.P_WAIT, script, script, op)
index 4a4f9f4946ac712e9655e8e1fd14f2960403d57b..576de6be16dac2a885f147d89c6a029878ad4e28 100644 (file)
@@ -39,6 +39,7 @@
 # todo Support security settings etc. in the config file.
 # todo Support command-line args.
 
+import fcntl
 from threading import Thread
 
 from xen.web.httpserver import HttpServer, UnixHttpServer
@@ -64,6 +65,11 @@ class XendServers:
         self.servers.append(server)
 
     def start(self, status):
+        # Running the network script will spawn another process, which takes
+        # the status fd with it unless we set FD_CLOEXEC.  Failing to do this
+        # causes the read in SrvDaemon to hang even when we have written here.
+        fcntl.fcntl(status, fcntl.F_SETFD, fcntl.FD_CLOEXEC)
+        
         Vifctl.network('start')
         threads = []
         for server in self.servers: